package com.order.manager.controller.Collect;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.order.manager.Model.CollectInfo;
import com.order.manager.Model.other.RestBean;
import com.order.manager.service.impl.CollectInfoServiceImpl;
import com.order.manager.util.JwtUtil;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**
 * 收藏功能控制器，处理用户对店铺的收藏、取消收藏和查询收藏状态等操作
 */
@RestController
@RequestMapping("/api/collect")
public class CollectController {

    // 注入收藏信息服务实现类，用于操作收藏相关业务逻辑
    @Resource
    CollectInfoServiceImpl collectInfoService;

    // 注入JWT工具类，用于从请求中解析用户身份信息
    @Resource
    JwtUtil jwtUtil;

    /**
     * 查询用户是否已收藏指定店铺
     * @param request HTTP请求对象，用于获取JWT令牌
     * @param shopId 路径变量，店铺ID
     * @return RestBean响应对象，包含操作结果和数据
     */
    @RequestMapping("/choose/{shopId}")
    public RestBean collectByUserShop(HttpServletRequest request, @PathVariable String shopId) {
        // 从请求头的JWT令牌中获取用户ID
        String uuid = jwtUtil.getJwtUsername(request);
        // 查询数据库中是否存在该用户收藏该店铺的记录
        return collectInfoService.getOne(new QueryWrapper<CollectInfo>().eq("collect_shop_id", shopId)
                .eq("collect_user_id", uuid)) != null
                // 存在则返回成功响应
                ? RestBean.success()
                // 不存在则返回失败响应，提示未关注
                : RestBean.failure(403, "该用户未关注该店铺");
    }

    /**
     * 用户收藏指定店铺
     * @param request HTTP请求对象，用于获取JWT令牌
     * @param shopId 路径变量，店铺ID
     * @return RestBean响应对象，包含操作结果和数据
     */
    @RequestMapping("/follow/{shopId}")
    public RestBean followShop(HttpServletRequest request, @PathVariable String shopId) {
        // 从请求头的JWT令牌中获取用户ID
        String uuid = jwtUtil.getJwtUsername(request);
        // 查询数据库中是否存在该用户收藏该店铺的记录
        CollectInfo collectInfo = collectInfoService.getOne(new QueryWrapper<CollectInfo>().eq("collect_shop_id", shopId)
                .eq("collect_user_id", uuid));

        // 如果记录不存在，执行收藏操作
        if (collectInfo == null) {
            // 创建新的收藏记录对象
            CollectInfo collect = new CollectInfo();
            // 设置收藏时间为当前时间
            collect.setInputTime(new Date());
            // 设置收藏的店铺ID
            collect.setCollectShopId(shopId);
            // 设置收藏的用户ID
            collect.setCollectUserId(uuid);
            // 保存收藏记录到数据库
            return collectInfoService.save(collect)
                    // 保存成功返回成功响应，并携带收藏信息
                    ? RestBean.success(collectInfo)
                    // 保存失败返回失败响应，提示收藏失败
                    : RestBean.failure(500, "收藏失败");
        }
        // 如果记录已存在，返回失败响应，提示已关注
        return RestBean.failure(403,"你已关注该店铺");
    }

    /**
     * 用户取消收藏指定店铺
     * @param request HTTP请求对象，用于获取JWT令牌
     * @param shopId 路径变量，店铺ID
     * @return RestBean响应对象，包含操作结果和数据
     */
    @RequestMapping("/cancel/follow/{shopId}")
    public RestBean cancelFollowShop(HttpServletRequest request, @PathVariable String shopId) {
        // 从请求头的JWT令牌中获取用户ID
        String uuid = jwtUtil.getJwtUsername(request);
        // 查询数据库中是否存在该用户收藏该店铺的记录
        CollectInfo collectInfo = collectInfoService.getOne(new QueryWrapper<CollectInfo>().eq("collect_shop_id", shopId)
                .eq("collect_user_id", uuid));

        // 如果记录不存在，返回失败响应，提示未收藏
        if (collectInfo == null)
            return RestBean.failure(403,"你尚未收藏该店铺");

        // 如果记录存在，从数据库中删除该收藏记录
        return collectInfoService.removeById(collectInfo)
                // 删除成功返回成功响应，并携带被删除的收藏信息
                ? RestBean.success(collectInfo)
                // 删除失败返回失败响应，提示取消收藏失败
                : RestBean.failure(500, "取消收藏失败");
    }
}